import { reqCode, reqLogin, reqLogout, reqRegister, reqUserInfo } from '@/api'
import { getUserTempId } from '@/utils/userabout'

//初始化的数据
const state = {
	userTempId: getUserTempId(),
	token: localStorage.getItem('TOKEN'), // 刷新页面的时候,直接去localstorage中获取
	userinfo: {}
}

//用于真正操作数据
const mutations = {
	CLEAR_TOKEN() {
		state.token = "";
		localStorage.removeItem('TOKEN') // 清除token的时候,同时把localstorage中token清除
	},
	SAVE_TOKEN(state, token) {
		state.token = token;
		localStorage.setItem('TOKEN', token); // 存储的时候同时存到localStorage中
	},
	SAVE_USERINFO(state, userinfo) {
		state.userinfo = userinfo;
	}
}

//用于响应组件中的“动作”
const actions = {
	// 退出登录
	async setLogout({ commit }) {
		try {
			let result = await reqLogout();
			if (result && result.code == 200) {
				// 清除本地的 个人信息 和 token
				commit('SAVE_USERINFO', {})// 清除store个人信息
				commit('CLEAR_TOKEN') // 清除token
				alert('退出登录成功')
			} else {
				alert(result.message)
				console.error(result.message)
			}
		} catch (error) {
			console.error('退出登录失败', error)
			alert('退出登录失败')
			// 没有return 失败的promise是因为外部不需要知道这里出错了
		}
	},
	// 清除token
	clearToken({ commit }) {
		commit('CLEAR_TOKEN')
	},
	// 获取个人信息
	async getUserInfo({ commit }) {
		try {
			let result = await reqUserInfo();
			if (result && result.code == 200) {
				commit('SAVE_USERINFO', result.data)
			} else {
				return Promise.reject(result.message) // 请求成功,但是后端接口返回信息失败
			}
		} catch (error) {
			return Promise.reject(error) // 网络错误
		}
	},
	// 登录
	async setLogin({ commit }, data) {
		try {
			let result = await reqLogin(data);
			if (result && result.code == 200) {
				// 把token存储到store当中
				commit('SAVE_TOKEN', result.data.token)
			} else {
				return Promise.reject(result.message)
			}
		} catch (error) {
			return Promise.reject(error);
		}
	},
	// 注册接口
	async setRegister({ commit }, data) {
		try {
			let result = await reqRegister(data);
			if (result && result.code == 200) {
				return 'ok'
			} else {
				return Promise.reject(result.message) // result.message服务器给前端返回的信息
			}
		} catch (error) {
			return Promise.reject(error)
		}
	},
	// 获取验证码
	async getCode({ commit }, phone) {
		try {
			let result = await reqCode(phone);
			if (result && result.code == 200) {
				// 这个code 不往store中存储了,直接抛出了,这个数据存储到store中,属实没必要
				return result
			} else {
				return Promise.reject('获取验证码失败')
			}
		} catch (error) {
			return Promise.reject(error)
		}
	}
}

//vuex层面的计算属性
const getters = {}

export default {
	namespaced: true, // 开启命名空间
	state,
	mutations,
	actions,
	getters
}